package com.zdsoft.finance.common.base;

import com.zdsoft.framework.core.common.domain.BaseEntity;
import com.zdsoft.framework.core.common.page.Page;
import com.zdsoft.framework.core.common.page.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.NoRepositoryBean;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 自定义操作库
 * 
 * @author LiaoGuoWei
 * @create 2016-10-27 10:00
 **/
@NoRepositoryBean
public interface CustomRepository<T extends BaseEntity, ID extends Serializable> extends JpaRepository<T, ID> {

	/**
	 * 通过HQL查找
	 * 
	 * @param hql
	 *            HQL语句
	 * @param condition
	 *            查询条件
	 * @return
	 */
	public List<T> findByHql(String hql, Map<String, Object> condition);

	/**
	 * 多条件分页查询
	 * 
	 * @param pageable
	 *            分页参数
	 * @param hql
	 *            查询HQL
	 * @param condition
	 *            查询条件
	 * @return
	 */
	public Page<T> findByHqlPage(Pageable pageable, String hql, Map<String, Object> condition);

	/**
	 * 分页查询自动封装
	 * @param pageable
	 * @param li
	 * @return
	 */
	public Page<T> findByHqlConditions(Pageable pageable, List<QueryObj> li);

	/**
	 * 获取当前查询条件下总条数
	 * 
	 * @param hql
	 *            查询HQL
	 * @param condition
	 *            查询条件
	 * @return
	 */
	public Long countAll(String hql, Map<String, Object> condition);

	/**
	 * 保存域对象
	 * 
	 * @param t
	 *            域对象
	 * @return
	 */
	public T saveEntity(T t);

	/**
	 * 更新实体
	 * 
	 * @param t
	 *            需更新的实体
	 * @return
	 */
	public T updateEntity(T t);

	/**
	 * 逻辑删除
	 * 
	 * @param t
	 *            需要删除的域对象
	 * @return
	 */
	public T logicDelete(T t);
}
